package com.example.algorithm.LinkedListAlgorithm;

/**
 * 1) 单链表反转
 * Created by ZMJ on 2020/1/10.
 */
public class ReverseLinked {


     // 单链表反转
    public static Node reverse(Node head) {
        //单链表为空或只有一个节点，直接返回原单链表
        if (head == null || head.getNext() == null) {
            return head;
        }
        //前一个节点指针
        Node preNode = null;
        //当前节点指针
        Node curNode = head;
        //下一个节点指针
        Node nextNode = null;

        while (curNode != null) {
            nextNode = curNode.getNext();//nextNode 指向下一个节点
            curNode.setNext(preNode);//将当前节点next域指向前一个节点
            preNode = curNode;//preNode 指针向后移动
            curNode = nextNode;//curNode指针向后移动
        }

        return preNode;
    }



    public static void reverse_test() {
        // 初始链表
        Node head = new Node("1", "1");
        Node node2 = new Node("2", "2");
        Node tail = new Node("3", "3");

        head.setNext(node2);
        node2.setNext(tail);
        tail.setNext(null);

        // 打印 1:1 2:2 3:3
        Node.printLinkedList(head);
        // 反转一个链表
        reverse(head);
        // 打印 3:3 2:2 1:1
        Node.printLinkedList(tail);
    }


    public static void main(String args[]) {
        reverse_test();
    }

}